import numpy as np
import matplotlib.pyplot as plt

def calculate_learning_curve(y1, learning_rate, max_training=30):
    """
    计算改良学习曲线的预测分数
    :param y1: 第1次训练的分数
    :param learning_rate: 学习率 (LR)
    :param max_training: 最大训练次数 (默认30)
    :return: x轴数据, 预测分数列表
    """
    # 计算学习曲线参数b
    b = np.log(learning_rate) / np.log(2)
    
    x_values = np.arange(1, max_training + 1)
    predicted_scores = []
    
    for x in x_values:
        if x == 1:
            # 第1次直接使用y1
            zx = y1
        else:
            # 计算 Z_x = y1 * [x^(b+1) - (x-1)^(b+1)]
            term1 = np.power(x, b + 1)
            term2 = np.power(x - 1, b + 1)
            zx = y1 * (term1 - term2)
        
        predicted_scores.append(zx)
    
    return x_values, predicted_scores

def calculating_learning_rate(y_pre):
    """
    根据预置数据计算学习率
    :param y_pre: 预先准备好备牙分数数据
    :param x: 根据y_pre长度解出的要分析的备牙分数数组长度
    :return: 该组数据的预期学习率
    """
    x = len(y_pre)
    y_mean = np.mean(y_pre)
    LR = np.power(2, np.log10(y_mean/y_pre[0])/np.log10(x))
    return LR



# 输入参数（示例值，可修改）
#y1 = 55.85    # 第一次训练分数
#%LR = 1.1129    # 学习率
n = 30       # 预测次数

y = [55.85, 59.15, 62.04, 65.03, 68.57]
y1 = y[0]
LR = calculating_learning_rate(y)
#print("当前组数据的预测学习率为："+str(LR))
# 计算预测值
x, Z = calculate_learning_curve(y1=y1, learning_rate=LR, max_training=n)
#x, Z = calculate_learning_curve_2(y_pre=y, max_training=n)
# 输出预测值
for i in range(0,n):
    
    print ("第"+str(i+1)+"次得分预测为："+str(Z[i]))

# 绘制学习曲线
plt.figure(figsize=(10, 6))
plt.plot(x, Z, "b-o", linewidth=1.5, markersize=6, markerfacecolor="red")
plt.title(f"改良学习曲线预测 (y1={y1}, LR={LR})", fontproperties="SimHei")
#plt.title(f"改良学习曲线预测 (初始数据组：y="+str(y)+")", fontproperties="SimHei")
plt.xlabel("训练次数 (x)", fontsize=12, fontproperties="SimHei")
plt.ylabel("预测分数 (Z_x)", fontsize=12, fontproperties="SimHei")
plt.grid(True, linestyle="--", alpha=0.7)
plt.xticks(np.arange(0, n+1, 5))
plt.savefig('1.png')
plt.show()